"""
凯撒密码
实现一个凯撒密码，包括编码和解码。密钥为 1 ~ 25 之间的整数。
该密码旋转字母表中的字母（A ~ Z），编码将每个字母替换为字母表中下一个到第 25 个字母
因此，密钥 2 将 “HI” 加密为 “JK”，而密钥 20 将 “HI” 加密为 “BC” 。
这种简单的 “单字母替代密码” 几乎没有提供任何安全性，
因为拥有编码消息的攻击者可以使用频率分析来猜测密钥，或者只是尝试所有 25 个密钥。
"""


class Caesar:

    def __init__(self):
        self.LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        self.key = None
        self.message = None
        self.translated = ''

    def __crypt(self, mode):
        for symbol in self.message.upper():
            if symbol in self.LETTERS:
                num = self.LETTERS.find(symbol)
                if mode == 'encrypt':
                    num += self.key
                elif mode == 'decrypt':
                    num -= self.key

                if num >= len(self.LETTERS):
                    num -= len(self.LETTERS)
                elif num < 0:
                    num += len(self.LETTERS)

                self.translated += self.LETTERS[num]
            else:
                self.translated += symbol

        return self.translated

    def encrypt(self, message, key=0):
        self.translated = ''
        self.key = key
        self.message = message
        return self.__crypt('encrypt')

    def decrypt(self, message, key=0):
        self.translated = ''
        self.key = key
        self.message = message
        return self.__crypt('decrypt')


if __name__ == '__main__':
    cipher = Caesar()
    print(cipher.encrypt(message='Secret message.', key=13))
    print(cipher.decrypt(message='FRPERG ZRFFNTR.', key=13))
